#include "lrcpage.h"
#include "ui_lrcpage.h"

#include <QFile>
#include <QDebug>

LrcPage::LrcPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LrcPage)
{
    ui->setupUi(this);

    // 设置窗口为无边框
    setWindowFlag(Qt::FramelessWindowHint);

    connect(ui->hideBtn, &QPushButton::clicked, this, [=](){emit lrcPageMoveDown();});
}

LrcPage::~LrcPage()
{
    delete ui;
}

bool LrcPage::parseLrcFile(const QString &lrcFilePath)
{
    // 清空上一首歌的歌词
    lrcLines.clear();

    // 打开文件
    QFile file(lrcFilePath);
    if (!file.open(QIODevice::ReadOnly))
    {
//        qDebug() << "打开lrc文件：" << lrcFilePath << " 失败！";
        return false;
    }

    // 一次读取一行歌词
    while (!file.atEnd())
    {
        QString line = file.readLine(1024);
//        qDebug() << line;

        // 歌词解析
        // 1. 解析出时间和歌词文本，根据 ] 分割
        int start = 0, end = 0;
        end = line.indexOf(']', start);
        QString lrcTime = line.mid(start, end);
        QString lrcWord = line.mid(end + 1).trimmed();

        // 2. 在时间中解析出 分:秒.毫秒
        qint64 lineTime = 0;
        // 分
        start = 1;
        end = lrcTime.indexOf(':', start);
        lineTime = lrcTime.mid(start, end - start).toInt() * 60 * 1000;
        // 秒
        start = end + 1;
        end = lrcTime.indexOf('.', start);
        lineTime += lrcTime.mid(start, end - start).toInt() * 1000;
        // 毫秒
        start = end + 1;
        lineTime += lrcTime.mid(start).toInt() * 10;

        // 3. 保存该行
        lrcLines.push_back(LrcLine(lineTime, lrcWord));
    }

//    for (auto e : lrcLines)
//    {
//        qDebug() << e.lrcTime << e.lrcText;
//    }
    return true;
}

void LrcPage::showLrcWordLine(qint64 time)
{
    // 1. 根据当前播放歌曲的时间来获取当前歌词在lrcLines中的索引
    int index = getLrcLineIndex(time);

    // 2. 更新歌词到界面
    if (-1 == index)
    {
        ui->line1->setText("");
        ui->line2->setText("");
        ui->line3->setText("");
        ui->line4->setText("歌曲暂无歌词");
        ui->line5->setText("");
        ui->line6->setText("");
        ui->line7->setText("");
    }
    else
    {
        ui->line1->setText(getLrcWordByIndex(index - 3));
        ui->line2->setText(getLrcWordByIndex(index - 2));
        ui->line3->setText(getLrcWordByIndex(index - 1));
        ui->line4->setText(getLrcWordByIndex(index));
        ui->line5->setText(getLrcWordByIndex(index + 1));
        ui->line6->setText(getLrcWordByIndex(index + 2));
        ui->line7->setText(getLrcWordByIndex(index + 3));
    }
}

int LrcPage::getLrcLineIndex(qint64 time)
{
    if (lrcLines.empty())
    {
        // 表示当前歌曲没有lrc文件
        return -1;
    }

    if (time <= lrcLines[0].lrcTime)
    {
        return 0;
    }

    for (int i = 1; i < lrcLines.size(); ++i)
    {
        if (time < lrcLines[i].lrcTime) return i - 1;
    }

    // 最后一行
    return lrcLines.size() - 1;
}

QString LrcPage::getLrcWordByIndex(int index)
{
    if (index < 0 || index >= lrcLines.size()) return "";
    return lrcLines[index].lrcText;
}

void LrcPage::setLrcName(const QString &name)
{
    ui->musicName->setText(name);
}

void LrcPage::setLrcSinger(const QString &singer)
{
    ui->musicSinger->setText(singer);
}

void LrcPage::setLrcAlbum(const QString &album)
{
    ui->musicAlbum->setText(album);
}
